#if 1
#include <cstdio>
#include <cstring>
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;

#define pb push_back
#define mp make_pair
#define X first
#define Y second

typedef long long li;
typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;

const int maxn = 2000;
set<pii> ans;
int result[maxn][2][2];
int used[maxn][2][2];
bool dfs(int v, int t, vvi &g1, vvi &g2, vi &mt1, vi &mt2, bool right = true, bool wascomplite = false, bool first = false)
{
	if(!first && right && (v == t)) return true;
	if(!used[v][right][wascomplite]) used[v][right][wascomplite] = 1;
	else return result[v][right][wascomplite];

	if(!wascomplite)
	{
		if(right)
		{
			bool f = dfs(mt1[v], t, g1, g2, mt1, mt2, !right, !wascomplite);
			if(f) ans.insert( mp(v, mt1[v]) );
			result[v][1][1] = f;
		}
		else
		{
			bool f = dfs(mt2[v], t, g1, g2, mt1, mt2, !right, !wascomplite);
			if(f) ans.insert( mp(mt2[v], v) );
			result[v][0][1] = f;
		}
	}
	else
	{
		if(right)
		{
			for (int i = 0; i < g1[v].size(); ++i)
			{
				int to = g1[v][i];
				if(to == mt1[v]) continue;
				bool f = dfs(to, t, g1, g2, mt1, mt2, !right, !wascomplite);
				if(f) ans.insert( mp(v, to) );
				result[v][1][0] = f;
			}
		}
		else
		{
			for (int i = 0; i < g2[v].size(); ++i)
			{
				int to = g2[v][i];
				if(to == mt2[v]) continue;
				bool f = dfs(to, t, g1, g2, mt1, mt2, !right, !wascomplite);
				if(f) ans.insert( mp(to, v) );
				result[v][0][0] = f;
			}
		}
	}
	return false;
}	

int main()
{
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
#endif
	int n; scanf("%d", &n);
	vvi g1(n), g2(n);
	for (int i = 0; i < n; ++i)
	{
		int k; scanf("%d", &k);
		for (int j = 0; j < k; ++j)
		{
			int to; scanf("%d", &to);
			g1[i].push_back(to-1);
			g2[to-1].push_back(i);
		}
	}
	vi mt1(n), mt2(n);
	for (int i = 0; i < n; ++i) cin >> mt1[i];
	for (int i = 0; i < n; ++i)
	{
		mt1[i]--;
		mt2[mt1[i]] = i;
		ans.insert( mp(i, mt1[i]) );
	}
	for (int i = 0; i < n; ++i)
	{
		memset(result, 0, sizeof(result));
		memset(used, 0, sizeof(used));
		dfs(i, i, g1, g2, mt1, mt2, true, false, true);
	}
	vvi answer(n);
	for (set<pii>::iterator it = ans.begin(); it != ans.end(); ++it)
		answer[it->first].push_back(it->second);
	for (int i = 0; i < n; ++i)
	{
		printf("%d", answer[i].size());
		for (int j = 0; j < answer[i].size(); ++j) printf(" %d", answer[i][j] + 1);
		printf("\n");
	}
	return 0;
}
#endif